package hxy.bytecode.file;

import java.io.*;
import java.nio.channels.FileChannel;

/**
 * @author eric
 * @Description： 零拷贝的实现，需要linux内核的支持，2.4之后才支持零拷贝。发现利用filechannel使用的时间比普通的读取输入时间缩短了将近一半。普通的文件
 * @see: GeneralFileOperate.java
 * @date 12/9/19 10:22 AM
 * refer ： https://blog.csdn.net/qq_16628781/article/details/70532307
 */
public class FileChannelDemo {

    public static void main(String[] args) throws FileNotFoundException {
        String path0 = "";
        String path1 = "";

        File fromFile = new File(path0);
        File toFile = new File(path1);
        new FileChannelDemo().fileCopyWithFileChannel2(fromFile, toFile);
    }

    /**
     * 用filechannel进行文件复制
     *
     * @param fromFile 源文件
     * @param toFile   目标文件
     */
    public void fileCopyWithFileChannel(File fromFile, File toFile) {
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        FileChannel fileChannelInput = null;
        FileChannel fileChannelOutput = null;
        try {
            fileInputStream = new FileInputStream(fromFile);
            fileOutputStream = new FileOutputStream(toFile);
            //得到fileInputStream的文件通道
            fileChannelInput = fileInputStream.getChannel();
            //得到fileOutputStream的文件通道
            fileChannelOutput = fileOutputStream.getChannel();
            //将fileChannelInput通道的数据，写入到fileChannelOutput通道
            fileChannelInput.transferTo(0, fileChannelInput.size(), fileChannelOutput);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileInputStream != null)
                    fileInputStream.close();
                if (fileChannelInput != null)
                    fileChannelInput.close();
                if (fileOutputStream != null)
                    fileOutputStream.close();
                if (fileChannelOutput != null)
                    fileChannelOutput.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 用filechannel进行文件复制，采用try with resource
     *
     * @param fromFile 源文件
     * @param toFile   目标文件
     */
    public void fileCopyWithFileChannel2(File fromFile, File toFile) throws FileNotFoundException {
        // try with resources
        try (
                FileInputStream fileInputStream = new FileInputStream(fromFile);
                FileOutputStream fileOutputStream = new FileOutputStream(toFile);
                //得到fileInputStream的文件通道
                FileChannel fileChannelInput = fileInputStream.getChannel();
                //得到fileOutputStream的文件通道
                FileChannel fileChannelOutput = fileOutputStream.getChannel();
        ) {
            //将fileChannelInput通道的数据，写入到fileChannelOutput通道
            fileChannelInput.transferTo(0, fileChannelInput.size(), fileChannelOutput);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//    原文链接：https://blog.csdn.net/qq_16628781/article/details/70532307
}
